package Dominio;
//import prop.*;
import java.util.Vector;
import java.util.regex.Pattern;
import Vistas.FrecPal;

    /**Autor: Pedro Redondo Quesada **46471772R**/
public class Texto {
    /*final private String[] FNC= {"a","al","ante","bajo","cabe","con","contra","de","del","desde",
    "en","entre","hacia","hasta","para","por","según","sin","so","sobre","tras","el","los","la","las","don",
    "doña","este","esta","esto","ese","esa","eso","aquel","aquella","aquello","mio","mia","tuyo","tuya",
    "suyo","suya","nuestro","nuestra","vuestro","vuestra","mi","tu","su","nos","vos","yo","tu","ella",
    "nosotros","vosotros","ellos","usted","ustedes","me","te","se","mucho","mucha","muchos","muchas",
    "poco","poca","pocos","pocas","algun","alguna","alguno","algo","alguien","todo","toda","todos",
    "todas", "nada","nadie","bastante","bastantes","demasiado","demasiada","demasiados","demasiadas",
    "suficiente","suficientes","uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez",
    "once","doce","trece","catorce","quince","dieciseis","diecisiete","dieciocho","diecinueve","veinte",
    "cien", "cientos","centenar", "mil","miles","millar","millon","millones","primero","segundo","tercero",
    "cuarto","quinto","sexto","septimo","octavo","noveno","decimo","primera","segunda","tercera",
    "cuarta","quinta","sexta","septima","octava","novena","decima","y","e","ni","o","u","mas","menos",
    "pero","le","lo"};*/
    private DiccionarioPalabras FNC;      
    private String texto;
    private int indice;
    private Vector<String> listadopalabras;
    private Vector<String> listadobiwords;

//Constructoras
    
    /*INUTIL
     public Texto(){
    //{Pre: cierto}
    //{Post: genera un texto vacío}
    texto="";
    indice=0;
    this.listadopalabras=new Vector<String>(0,1);
    this.listadobiwords=new Vector<String>(0,1);
    this.FNC=new DiccionarioPalabras();
    }*/

    public Texto(String txt,DiccionarioPalabras D){
    //{Pre: txt no es vacio}
    //{Post: lee el String txt y genera un Texto}
        if (!txt.equals("") && !txt.equals(" ")){
            this.texto=txt;
            this.indice=0;
            this.listadopalabras=new Vector<String>(0,1);
            this.listadobiwords=new Vector<String>(0,1);
            this.FNC=D;
            String[] X=subsNoFuncional();
            tknFuncional(X);
            this.texto=txt;   
        }
     }
    
//Consultoras
    private void isBiword(String S){
    //{Pre: cierto}
    //{Post:anade al listado si el String es una concatenación válida de palabras
    // y modifica la posicion de indice al final de la secuancia de Biword}
      boolean b=true;
        String aux="";
        String fin="";
        int i=this.indice;
        int contpal=0;
        while(i<S.length() && b){
            if (S.charAt(i)>='A' && S.charAt(i)<='Z'){
                aux="";
                for(;i<S.length() && i<S.length() && S.charAt(i)!=' ' && S.charAt(i)!='\n';i++)
                    {aux=aux+S.charAt(i);}
                contpal++;
                fin=fin+" "+aux;
                if(i<S.length() && S.charAt(i)==' '){                    
                    for(;i<S.length() && (S.charAt(i)==' ' || S.charAt(i)=='x');i++){}
                }
                else    b=false; // hemos encontrado /n
                }
            else    b=false; // hemos encontado palabra en min
        }  
        if (contpal>1){
            this.indice=i-1;
            this.listadobiwords.addElement(fin);
        }             
     }

//Modificadoras

     private String[] subsNoFuncional(){
    //{Pre: cierto}j
    //{Post sustituye del texto las palabras funcionales por x y elimina los signos de puntuacion y acentos}
        int i;
        String actual;
        Pattern P=Pattern.compile("[!-/[\u00a1\u00BF][:-?]]");
        char[] nacc={'A','E','I','O','U','a','e','i','o','u'};
        char[] acc={'\u00c0','\u00c1','\u00c2','\u00c4','\u00c8','\u00c9','\u00ca','\u00cb','\u00cc','\u00cd','\u00ce','\u00cf','\u00d2','\u00d3','\u00d4','\u00d6','\u00d9','\u00da','\u00db','\u00dc','\u00e0','\u00e1','\u00e2','\u00e4','\u00e8','\u00e9','\u00ea','\u00eb','\u00ec','\u00ed','\u00ee','\u00ef','\u00f2','\u00f3','\u00f4','\u00f6','\u00f9','\u00fa','\u00fb','\u00fc'};
        for(i=0;i<acc.length;i++){
            this.texto=this.texto.replace(acc[i],nacc[i/4]);
        }
        String[] AUX=P.split(this.texto);
        for(int j=0;j<AUX.length; j++){
            AUX[j]=" "+AUX[j];
            actual="";
            for(i=1;i<AUX[j].length();i++){
                if(AUX[j].charAt(i)==' '){
                    if(esFuncional(actual)==true){
                        i=i-(actual.length()+2);
                        AUX[j]=AUX[j].replaceFirst(" "+actual+" "," x ");
                        //i=i-(actual.length());
                    }
                    actual="";
                }
                    else    actual=actual+AUX[j].charAt(i);
            }
        }
        return AUX;
    }
    
    private boolean esFuncional(String p){
        boolean b = false;
        if (p.compareTo("")!=0){
        p=p.toLowerCase();
        if (!FNC.existLetra(p.charAt(0))){
           b = false; 
        }
        else if((FNC.existPalabra(p)!=0))
           b = true;
        else b = false;
        }
        return b;
    }

    private void tknFuncional(String[] X){/**NO TOCAR**/
    //{Pre: el parametro implicito no contiene palabras funcionales}
    //{Post: convierte palabras funcinales en su raíz}
        int i;
        for(i=0;i<X.length;i++){
            for(this.indice=0;this.indice<X[i].length();this.indice++)
            this.isBiword(X[i]);
         }
        int j=0;
        for(j=0;j<X.length;j++){
            X[j]=X[j].toLowerCase();
            String aux="";
            for(i=0;i<X[j].length();){
                if(i<X[j].length() && X[j].charAt(i)!=' ' && X[j].charAt(i)!='\n'){
                    for(;i<X[j].length() && X[j].charAt(i)!=' ' && X[j].charAt(i)!='\n';i++)
                            {aux=aux+X[j].charAt(i);}
                    }
                else if(i<X[j].length() && (X[j].charAt(i)==' ' || X[j].charAt(i)=='x')){
                    for(;i<X[j].length() && (X[j].charAt(i)==' ' || X[j].charAt(i)=='x');i++){}
                }
                else{i++;}
                if(!aux.equals("")){
                    aux=tknpal(aux);
                    this.listadopalabras.addElement(aux);
                    aux="";
                }
                                         
                
             }
        }
    }
    
    private String tknpal(String p){
        /*p=p+" ";
        String[] suff={"os","a","as","ar","er","ir","ante","iente","ente","or","ora"};
        boolean b;
        int i;
        for(i=0,b=false;!b && i<suff.length;i++){
            if(p.endsWith(suff[i]) && (p.length()>(suff[i].length()+3))){
                p=p.replaceFirst(suff[i]+" ","");
                b=true;
            }
        }*/
        return p;             
    }
    
    public Vector<FrecPal> consultarClaves(){
        return palVec(this.listadopalabras);
    }
    
    public String consultarTexto(){
        return this.texto;
    }
    
    public Vector<FrecPal> consultarBiClaves(){
        return palVec(this.listadobiwords);
    }
    
     private Vector<FrecPal> palVec(Vector<String> vec) {
        Vector<FrecPal> fp = new Vector<FrecPal>(0,1);
        String pal;
        boolean trobat;
        for(int i = 0; i<vec.size();i++){
            pal = vec.get(i);
            trobat=false;
            for (int j = 0; j < fp.size() && !trobat; j++){
                if(fp.get(j).pal.compareTo(pal)==0) {
                   fp.get(j).frec++;
                   trobat=true;
                }
            }
            if(!trobat){
                FrecPal p= new FrecPal();
                p.frec=1;
                p.pal=pal;
                fp.addElement(p);
            }
        }
        return fp;
    }
    
 }
